#include <iostream>

using namespace std;
/*
 * 钻石继承问题
 */
class Animal {
public:
	int age;
};
class Sheep : virtual public Animal {};
class Tuo : virtual public Animal {};

class SheepTuo : public Tuo, public Sheep{};
void test() {
	SheepTuo st;
	st.Animal::age = 9;
	st.Tuo::age = 10;
	st.Sheep::age = 11;
	// 没有虚继承时
	// 根据输出结果来看 animal.age似乎是 继承列表中第一个位置 的类成员的值
	// 这里 sheepTuo的继承列表中第一个是Tuo，所以 Animal的age就是 Tuo::age 10
	cout << "st.Animal::age is " << st.Animal::age<< endl;
	cout << "st.Sheep::age is " << st.Sheep::age << endl;
	cout << "st.Tuo::age is " << st.Tuo::age << endl;
	// 没有虚继承时大小是8字节：
	// 两个类中 各有一个int age数据, 占用2 * 4 = 8字节
	// 虚继承以后 大小是12 字节：
	// age数据只有一份，Sheep 和 Tuo 中各自保存着一个指向Animal::age的指针，
	// 总大小是 4 + 4 + 4 = 12 字节
	cout << "sizeof sheepTuoo is " << sizeof(st) << endl;
}
int main() {
	test();
	return 0;
}